// 1. 数组
/**
 * 1. 数组使用（声明、初始化）
 * 2. 多维数组（初始化、第一维可以省写、内部嵌套的括号是可选的、访问多维数组元素）
 * 3. 指向数组的指针 （数组名是指向数组内第一的元素的指针、通过指针访问数组元素）
 * 4. 传递数组给函数（#41 三种写法、#42 传递二维数组给函数（二维指针如何拿数组元素） ）
 * 5. 从函数返回数组（指针接收、static）
 * 
 * 扩展:
 * 1.setw、setfill使用
*/

#include <iostream>
#define __mark 42

/*
  传递数组给函数的三种方法
*/
#if __mark == 41
double average_1(int *, int);
double average_2(int[5]);
double average_3(int[], int);
int main(void)
{
  // std::cout <<"4-1" << std::endl;
  int nums1[] = {1, 2, 3, 4, 5};
  double val;
  int size = sizeof(nums1) / sizeof(nums1[0]);
  std::cout << "size : " << size << std::endl;

  // val = average_1(nums1, size);
  // val = average_2(nums1);
  val = average_3(nums1, size);
  std::cout << "val : " << val << std::endl;
  printf("-------------end----------------\n");
  // system("pause");
  return 0;
}

double average_1(int *arr, int size)
{
  int total = 0;
  for (int i = 0; i < size; i++)
  {
    // int el = *(arr + i);
    int el = arr[i];
    std::cout << "arr[" << i << "] : " << el << std::endl;
    total += el;
  }

  return (double)total / size;
}

double average_2(int arr[5])
{
  int total = 0;
  for (int i = 0; i < 5; i++)
  {
    // int el = *(arr + i);
    int el = arr[i];
    std::cout << "arr[" << i << "] : " << el << std::endl;
    total += el;
  }

  return (double)total / 5;
}

double average_3(int arr[], int size)
{
  int total = 0;
  for (int i = 0; i < size; i++)
  {
    // int el = *(arr + i);
    int el = arr[i];
    std::cout << "arr[" << i << "] : " << el << std::endl;
    total += el;
  }

  return (double)total / size;
}

/**
 * 传递二维数组给函数
*/
#elif __mark == 42
int sum_1(int **, int, int);
int sum_2(int[2][5]);
int sum_3(int[][5], int);
int main()
{
  int nums[2][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
  int a = sizeof(nums) / sizeof(nums[0]);
  int b = sizeof(nums[0]) / sizeof(nums[0][0]);
  std::cout << "a,b : " << a << "," << b << std::endl;

  int val;
  // val = sum_1(nums, a, b); // int (*)[5] 与 int **类型不匹配
  // val = sum_1((int **)nums, a, b);

  // val = sum_2(nums);

  val = sum_3(nums, a);

  std::cout << "val : " << val << std::endl;

  printf("-------------end----------------\n");
  // system("pause");
  return 0;
}

int sum_1(int **arr, int a, int b)
{
  int total = 0;
  for (int i = 0; i < a; i++)
  {
    for (int j = 0; j < b; j++)
    {
      // int el = arr[i][j]; // 已终止，退出代码: 3221225477。
      // int el = *((int *)arr + i * b + j);
      int el = ((int *)arr + i * b)[j];
      std::cout << "arr[" << i << "][" << j << "] : " << el << std::endl;
      total += el;
    }
  }
  return total;
}

int sum_2(int arr[2][5])
{
  int total = 0;
  for (int i = 0; i < 2; i++)
  {
    for (int j = 0; j < 5; j++)
    {
      // int el = arr[i][j];
      // int el = *((int *)arr + i * 5 + j);
      int el = ((int *)arr + i * 5)[j];
      std::cout << "arr[" << i << "][" << j << "] : " << el << std::endl;
      total += el;
    }
  }
  return total;
}

int sum_3(int arr[][5], int a)
{
  int total = 0;
  // std::cout << "sizeof(arr) : " << sizeof(arr) << std::endl; // 8
  for (int i = 0; i < a; i++)
  {
    for (int j = 0; j < 5; j++)
    {
      // int el = arr[i][j];
      // int el = *((int *)arr + i * 5 + j);
      int el = ((int *)arr + i * 5)[j];
      std::cout << "arr[" << i << "][" << j << "] : " << el << std::endl;
      total += el;
    }
  }
  return total;
}

#elif __mark == 'z'

int main()
{

  printf("-------------end----------------\n");
  // system("pause");
  return 0;
}

#endif